“Las matemáticas están interesadas en los sistemas infinitos, mientras la informática no”
(Donald Knuth)
“Las matemáticas tratan de teoremas y relaciones estáticas, mientras que la Informática trata de algoritmos y relaciones dinámicas”
(Donald Knuth)
La Naturaleza de la Informática
La informática o la ciencia de los ordenadores (Computer Science) nació por la convergencia de varias disciplinas:
La matemática, que aportó las bases teóricas.
La física, que aportó los circuitos electrónicos.
La lingüística, que ayudó a establecer la estructura sintáctica (la gramática formal) de los lenguajes de programación. Aunque en los comienzos de la programación no se especificaba una gramática formal, hoy día es imprescindible.
El desarrollo de los ordenadores fue la culminación de varias ideas clave:
El código binario, que se remonta a la antigua sabiduría china del I Ching y a su descubrimiento por parte de Leibniz.
El álgebra de Boole, presentada en 1854 en “Las leyes del Pensamiento”, basada en simples leyes lógicas sobre valores binarios.
La introducción por Alan Turing de una máquina abstracta, de funcionamiento muy simple −la que hoy denominamos “máquina de Turing”− que permitía implementar cálculos específicos mediante un programa (conjunto de instrucciones) y unos datos de entrada. Esta máquina permitió definir los conceptos de computación y algoritmo.
Turing también ideó una máquina universal, en la que el programa residía internamente en la memoria de la máquina, y que permitía realizar todo tipo de cálculos. Esta idea clave y fundamental sentó las bases teóricas para el posterior desarrollo del ordenador, una máquina de “propósito general” o universal capaz de realizar todo tipo de procesos. En definitiva, permitió hacer flexible el hardware.
La teoría de la información y la comunicación, creada por Claude Shannon. Shannon demostró que el álgebra de Boole se podía implementar mediante circuitos electrónicos.
John von Neumann fue el creador de la arquitectura de ordenador que lleva su nombre (arquitectura von Neumann), arquitectura basada en el concepto de Turing de programa almacenado en memoria para que la máquina fuera universal, es decir, para que fuera capaz de realizar cualquier cálculo. Von Neumann fue el creador del primer ordenador electrónico digital de propósito general (el ENIAC).
Pero no podemos olvidar a Ada Lovelace fue la primera persona que escribió un programa de ordenador, tomando como base el diseño funcional de la máquina analítica de Babbage.
Ada avanzó varios conceptos importantes, que se harían realidad años más tarde. Inventó el concepto de máquina universal para realizar computaciones numéricas y procesos simbólicos. Inventó también el concepto de programa o algoritmo, con tres estructuras: subrutinas, bucle y bifurcación condicional. En definitiva, Ada dio el salto conceptual desde la máquina calculadora al ordenador de propósito general. El ordenador, tal y como lo concebimos hoy (un dispositivo universal) fue imaginado por Ada y posteriormente desarrollado por Turing y Von Neumann.
Hay que distinguir entre informática teórica e informática práctica. La informática teórica nació con Boole, Ada Lovelace, Turing y Shannon. La informática práctica nació con von Neumann. Turing y Shannon también actuaron como puentes entre la informática teórica y la práctica.
A pesar de todos estos antecedentes conocidos, se discute sobre la verdadera naturaleza de la informática. Esto es justificable, pues si existen dudas sobre la naturaleza de la matemática, parecería lógico que también existan dudas sobre la naturaleza de la informática, heredera en gran parte de la matemática. Existen diferentes opiniones al respecto, entre ellas las siguientes:
La ciencia de los principios teóricos y prácticos de los ordenadores.
La ciencia de la computación.
La ciencia de los algoritmos.
La matemática finita o discreta.
La matemática práctica o experimental.
Una rama de la ingeniería.
Una rama de la lingüística.
Los Lenguajes de Programación
La crisis del software. La crisis de los lenguajes de programación
En 1968, durante la NATO Software Engineering Conference, se acuñó el término “crisis del software” para indicar que el software era difícil de crear, mantener, planificar, controlar, poco flexible, poco fiable y poco reusable. Han pasado muchos años desde entonces, sin embargo, el problema subsiste, pues no se ha encontrado una solución plenamente satisfactoria.
Un aspecto esencial del desarrollo de aplicaciones informáticas lo constituye el lenguaje de programación, que sigue siendo realmente frustrante, principalmente por el modelo de pensamiento que impone. Realmente hay que hablar de la crisis del lenguaje, más que del software, crisis que no se superará hasta que dispongamos de un lenguaje estándar, universal, potente, flexible, de alto nivel, creativo, fácil de aprender y de usar.
Desde los orígenes de la informática se han inventado muchos lenguajes de programación, y todavía siguen inventándose. Y aunque existen muchas razones para hacerlo, como la aplicación de diferentes puntos de vista, paradigmas, modelos, etc., la razón principal de fondo es la insatisfacción. Todavía no se ha encontrado un lenguaje de programación que se ajuste plenamente, que encaje con nuestro modelo de pensamiento, de tal forma que exista perfecta correspondencia entre nuestros recursos semánticos internos y los conceptos proporcionados por el lenguaje de programación.
Ha habido, a lo largo de la relativamente corta historia de los lenguajes de programación, una serie de hitos que han supuesto avances importantes por la aportación de nuevas ideas que posteriormente han sido adoptadas por otros lenguajes. Entre estos lenguajes están Pascal, Algol 68, Simula 67, Lisp, AWK, Snobol y Prolog. En los últimos años se ha reavivado el interés por el diseño de nuevos lenguajes de programación. Fruto de este interés han sido nuevos lenguajes como CLU, Euclid, Mesa, etc.
Hoy día se siguen inventando nuevos lenguajes de programación de propósito general que intentan superar las limitaciones de los actuales, adoptando nuevos paradigmas o integrando paradigmas ya existentes, con el objeto de proporcionar una mayor generalidad, expresividad y flexibilidad.
Hay muchas alternativas para mejorar esta situación. Una de ellas es, como afirma Terry Winograd [1979], abandonar nuestra visión obsoleta de lo que es la programación y los lenguajes de programación y comenzar otra vez por el principio.
John Backus [1978], en su famosa conferencia del premio Turing, ya sugirió que la “crisis del software” sólo puede superarse mediante un enfoque revolucionario en el diseño de los lenguajes de programación y en la propia tarea de la programación. Aunque Backus abogó por un enfoque funcional, su manifiesto sigue plenamente vigente.
Pero no solo hay lenguajes de programación. Hay toda clase de lenguajes informáticos: de programación, de especificación, de inteligencia artificial, de representación del conocimiento, de gestión de bases de datos, de marcaje, de guionado, etc. El problema principal es que todos estos lenguajes son diferentes y están desconectados entre sí. Lo ideal es que existiera un lenguaje madre o un núcleo conceptual común del que surgieran los diferentes lenguajes particulares.
Multiplicidad de paradigmas de programación
Desde que Thomas S. Kuhn [1977] utilizó la palabra “paradigma” para referirse a una forma de ver el mundo y señalar que la evolución científica se produce, no de forma continua, sino por saltos provocados precisamente por cambios de paradigma, este término se ha impuesto en el área de los lenguajes de programación para indicar los diferentes enfoques o puntos de vista respecto a la concepción del proceso de programación y a la forma de modelar un dominio de problemas.
Desde el principio de la informática, los lenguajes de programación se han intentado reducir a una sola primitiva conceptual. Pero tras el concepto elegido hay otra serie de conceptos auxiliares o de segundo nivel. Por ejemplo, en programación imperativa la primitiva conceptual es la sentencia, pero hay sentencias aritméticas, lógicas, de control, etc.
Los paradigmas de programación que podemos considerar “clásicos”, y sus correspondientes primitivas conceptuales, son:
Paradigma
Primitiva conceptual
Imperativo
Sentencia
Funcional
Función
Lógico
Regla (condición → acción)
Relacional
Relación (tabla)
Objetual
Objeto
Se tenía la esperanza de que el paradigma objetual o paradigma orientado a objetos (POO) fuera el paradigma “definitivo”, la forma más adecuada de concebir la realidad y modelar los problemas. Pero pronto se constató que era un paradigma más, con sus correspondientes limitaciones, y además el más complejo de todos.
Tras los paradigmas clásicos han surgido nuevos paradigmas (también basados en una primitiva conceptual) como la programación orientada a aspectos, a agentes, a eventos, a restricciones, etc. Este proceso tipo “torre de Babel” parece no tener fin, lo que ha provocado una situación más que desconcertante. Cualquiera de estos paradigmas es legítimo, pero ninguno satisface plenamente, pues no son suficientemente genéricos. Los paradigmas son útiles y necesarios, pero el problema reside en que:
Los lenguajes de programación son el resultado de aplicar paradigmas, que son, en todos los casos, visiones o enfoques más o menos particulares y restrictivos que imponen un modelo conceptual restrictivo, limitando así la libre expresión y la creatividad.
Todos los lenguajes de programación creados nacen desconectados entre sí, sin un núcleo conceptual común.
Cuando se diseña un nuevo lenguaje, asociado a un determinado paradigma, hay que crearlo desde cero.
Hasta ahora no ha aparecido el paradigma “definitivo”, un paradigma universal tal que los demás paradigmas sean casos particulares. Este paradigma universal sería solo posible con un lenguaje formal universal.
Los lenguajes multiparadigma
La mayoría de los lenguajes de programación soportan un sólo paradigma, es decir, una única forma de modelar y contemplar los problemas. Esto implica una restricción sobre otras posibles alternativas y, por lo tanto, un freno al pensamiento creativo, al imponer un modelo mental único.
Para superar las restricciones mentales impuestas por los lenguajes monoparadigma han surgido los llamados “lenguajes multiparadigma” [Hailpern, 1986, 1987] [Placer, 1991].
Los lenguajes multiparadigma se justifican porque hay problemas que no se adaptan de manera completa a un sólo paradigma, problemas en los que es adecuado aplicar un cierto paradigma en una parte, y otro paradigma diferente en otra parte. Y porque se necesita más margen de maniobrabilidad y libertad más allá de las limitaciones impuestas por un sólo paradigma.
Existen numerosísimos ejemplos de integración de paradigmas. He aquí algunos:
Integración de los paradigmas procedimental, funcional, lógico, relacional y orientación a objetos: G [Placer, 1988, 1991, 1992].
Integración de los paradigmas imperativo, funcional y lógico: Nial [Jenkins, 1986, 1988, 1989], [Jenkins &Glasgow, 1989] [Glasgow, 1988, 1988-1, 1991].
Integración de los paradigmas lógico, funcional y orientación a objetos: LIFE [Ait-Kaci & Podolski, 1991].
Integración de paradigmas lógico y funcional: Funlog [Subrahmanyam & You, 1984], TABLOG [De Root, 1986], LEAF, LOGLISP (Lisp con soporte de programación lógica).
Integración de paradigmas lógico y orientación a objetos: SPOOL [Koschman & Evens, 1988].
Integración de paradigmas funcional y orientación a objetos: Flavors [Moon, 1986], Common Loops [Bobrow, 1986].
Integración de los paradigmas relacional y orientación a objetos: DSM [Rumbaugh, 1987].
A veces no se integran paradigmas completos, sino sólo algunas características de un cierto paradigma, por ejemplo:
El lenguaje FGL incorpora al paradigma funcional el concepto de variable lógica [Lindstrom, 1985].
Teoría clásica de conjuntos y lenguajes funcionales [Howe &Stoller, 1994].
Conjuntos finitos y programación lógica [Dovier y otros, 1993].
Existen las siguientes formas de integración de paradigmas:
Mediante interfases entre diferentes lenguajes monoparadigma.
Extendiendo un lenguaje monoparadigma para que soporte otro u otros paradigmas.
En general se trataría de la mera acumulación de las características o recursos lingüísticos asociados a los paradigmas componentes.
Creando nuevos lenguajes que soporten varios paradigmas con una estructura lingüística unificada.
Este último camino es el más interesante, pues lo que se pretende es integrar los diferentes paradigmas mediante el uso de una semántica profunda subyacente, extrayendo los mecanismos genéricos presentes en la raíz de todos los paradigmas particulares. Este enfoque es el que más puede ayudar a entender las conexiones entre los diversos paradigmas que hoy se consideran separados y desconectados.
Brent Hailpern [1986] afirma que esta relativamente nueva área de investigación de los lenguajes multiparadigma es "excitante y vital", pero que son necesarios esfuerzos teóricos y prácticos antes de que este área madure y sea bien comprendida.
Con este enfoque también se evita la denominada "impedance mismatch" (desajuste de impedancias), que se refiere al problema de la existencia de diferentes modelos de pensamiento en un lenguaje multiparadigma. Con un enfoque integrador que utilice sólo mecanismos genéricos, tal desajuste no existiría.
Otras limitaciones de los lenguajes de programación
Falta de visión global.
Los lenguajes de programación no ofrecen una visión global de sus recursos, principalmente por dos razones:
Inflación conceptual.
Se utilizan demasiados conceptos, poco genéricos, a veces no bien definidos, algunos aislados y otros que rara vez se utilizan.
Falta de ortogonalidad.
La mayoría de los lenguajes de programación no son ortogonales. La ortogonoalidad es la capacidad combinatoria sin restricciones de los recursos del lenguaje. Los lenguajes, en este sentido, presentan numerosas excepciones. Por ejemplo: una función no admite otra función como argumento, un procedimiento no puede formar parte de una estructura de datos, etc.
La visión global de un lenguaje tiene que ver con el modo de conciencia del lado derecho del cerebro (sintético, holista), aspecto que se ha ignorado o descuidado en los lenguajes tradicionales, pero que es fundamental para la comprensión global de un lenguaje.
No reflexión conceptual.
Los lenguajes de programación no permiten la reflexión conceptual, es decir, aplicar un concepto a sí mismo. Por ejemplo: funciones de funciones, reglas de reglas, objetos de objetos, etc.
Los tipos de datos.
Los tipos de datos en los lenguajes de programación se inventaron por cuestiones implementadoras: para detección de errores y para mejorar el rendimiento. Un lenguaje universal no los necesitaría, pues de usarlos limitarían la libertad y la expresividad.
Dicotomía lenguajes de programación – lenguajes de especificación.
Debería haber un lenguaje único que pudiera aplicarse para todos los grados de abstracción: desde la especificación (lo general) hasta la programación (el detalle).
Dicotomía entre lenguaje operativo y descriptivo.
Normalmente los lenguajes de programación son operativos. Los de muy alto nivel también incluyen recursos descriptivos. Pero ambos aspectos no están integrados en la misma estructura lingüística.
Dicotomía entre datos y procesos.
Las estructuras de datos y de procesos son diferentes.
Dicotomía entre lenguaje numérico-simbólico y el lenguaje gráfico.
Son lenguajes distintos y no integrados. Además hay dicotomía entre el código que genera un gráfico y el fichero de datos que describe el gráfico.
La Semántica de los Lenguajes de Programación
El término “semántica” se usa en lingüística y se refiere al significado asociado a las construcciones sintácticas de un lenguaje. En los lenguajes de programación, la semántica se considera que tiene dos aspectos:
Semántica estática. Es la información generada en tiempo de compilación.
Semántica dinámica. Es la información interpretada en tiempo de ejecución.
La frontera entre ambos tipos de semánticas es, no obstante, algo difusa.
En la teoría de los lenguajes formales, el campo de la sintaxis está bien establecido a través de los diferentes tipos de gramáticas (que son realmente metalenguajes). En cambio, la formalización de la semántica ha sido hasta ahora, un tema mucho más complejo, al que se han propuesto diferentes soluciones, pero sin que exista hasta ahora un modelo estándar, plenamente aceptado, como en el caso de la sintaxis formal.
Como consecuencia de dicha complejidad, la semántica no ha desempeñado hasta ahora el papel central que le debería corresponder (en el diseño, en la implementación y en la utilización), pese a ser el aspecto más importante de un lenguaje de programación. Este papel central se lo ha arrebatado la sintaxis formal, tema que debería ser considerado secundario, pues existen muchas formas sintácticas posibles para representar una misma semántica.
En la definición de un lenguaje de programación, la semántica debería ser lo primero en definirse, y luego la sintaxis. Pero la situación actual es la contraria: se define primero la sintaxis (que es una tarea relativamente fácil) y posteriormente se trata de definir la semántica, casi siempre de una manera “forzada”, acudiendo a algún modelo conceptual que se adapte lo más posible al lenguaje. Como esta adaptación no es fácil ni normalmente tampoco es completa, es frecuente que se acuda (de forma complementaria o sustitutiva) al lenguaje natural, utilizado de manera más o menos literaria o estructurada.
El llamado “gap semántico” es la existencia de una disociación o separación entre los conceptos utilizados en un lenguaje de programación y los conceptos que se utilizan durante el desarrollo de aplicaciones, tanto en el tema de los datos como en el de los procesos.
Ha habido un fundamentalismo sintáctico imperante hasta ahora, es decir, se ha dado una importancia excesiva a la sintaxis, en detrimento de la semántica. Chomsky es el principal “culpable”, pues con su gramática generativa fue el impulsor de la sintaxis formal, sin referencia alguna al significado. Es absolutamente necesario invertir esta situación: lo primero es la semántica (el aspecto profundo de un lenguaje) y luego la sintaxis (el aspecto superficial).
Es necesario hacer explícita la semántica. La semántica está siempre presente en todos los lenguajes formales, pero el problema es que está casi siempre oculta, pues no existe una correspondencia clara y biunívoca entre forma (sintaxis) y fondo (semántica).
Actualmente la semántica está teniendo un creciente interés por la denominada “web semántica”, la nueva generación de la web (una iniciativa del W3C), La web semántica está basada en un espacio flexible y abierto de conceptos y relaciones. El objetivp es superar así las limitaciones de la web actual (basada principalmente en meros enlaces explícitos) e ir en la línea de la emulación de la mente, es decir, una web inteligente en la que se dispondría de funcionalidades avanzadas como: búsqueda semántica, gestión del conocimiento, automatización de procesos de razonamiento y de toma de decisiones, etc.
La web semántica ha provocado la aparición de nuevos lenguajes, con el consiguiente crecimiento adicional de la torre de Babel lingüística. Estos nuevos lenguajes se basan en ontologías, que permiten modelar, describir y representar un dominio. La ontología de un dominio consiste en la selección de un conjunto básico de conceptos y el establecimiento de las relaciones entre ellos.
Los intentos de capturar la semántica de los lenguajes de programación
Ha habido numerosos intentos de capturar la semántica de los lenguajes de programación. Los modelos formales más importantes utilizados hasta el momento han sido los siguientes:
Semántica operacional (o interpretativa). La semántica se expresa mediante operaciones.
Semántica denotacional. Las denotaciones son unas entidades matemáticas que se denominan “funciones semánticas” que hacen corresponder a cada dominio sintáctico un dominio semántico.
Semántica axiomática. La semántica se expresa mediante axiomas y reglas de inferencia.
Semántica algebraica. La semántica se expresa mediante construcciones algebraicas.
Gramáticas de atributos. Son gramáticas formales a las que se añaden atributos.
Gramáticas modificables. Son gramáticas que permiten la modificación del conjunto de reglas sintácticas durante el proceso de análisis sintáctico.
Gramáticas semánticas. Son gramáticas estructuradas a base de conceptos.
Teoría de categorías. Una categoría es una estructura algebraica que consta de una colección de objetos y unas conexiones entre ellos (flechas o morfismos). La semántica de los objetos y sus relaciones se deja abierta.
Todos estos modelos han sido infructuosos. La razón estriba en que la semántica de un lenguaje es imposible capturarla, porque capturarla es traer la semántica a la superficie, y ahí la semántica ya deja de serlo porque la semántica reside en lo profundo.
La única forma de capturar la semántica es definir o establecer un conjunto de conceptos genéricos (o universales) y definir una sintaxis, no para los conceptos (que son irrepresentables), sino para las expresiones particulares (o manifestaciones) de esos conceptos.
El lenguaje universal y el paradigma universal
La evolución de la informática está pues gravemente comprometida por la ausencia de un lenguaje estándar universal y un paradigma universal. Esta falta de estandarización tiene dos aspectos:
Semántico.
No existe un conjunto mínimo de conceptos comúnmente aceptados, ortogonales (independientes entre sí), y que no dependan de la implementación, de ninguna arquitectura de máquina. Por todo ello, la semántica formal no ha llegado al gran público. “Lo que se necesita es una semántica popular” [Schmidt, 1997].
Sintáctico.
Falta una notación canónica plenamente aceptada que sea además reflejo de la semántica.
Este lenguaje estándar debería cubrir también los aspectos operativo y descriptivo. El objetivo final sería lograr un estándar que permita una perfecta portabilidad de código (de datos y procesos).
La complejidad y la dificultad en la definición de un lenguaje estándar universal parece provenir precisamente de la adopción de enfoques particulares y en la no utilización de recursos semánticos de “muy alto nivel”. Sólo un enfoque genérico puede ayudar a integrar los diferentes paradigmas y reducir esta complejidad, que sólo es aparente, pues en la raíz de todos los paradigmas deben ocultarse conceptos simples y universales.
Lo que necesitamos ahora es un cambio cultural, más que tecnológico, cambio que tiene que ser forzosamente de tipo unificador. Debemos seguir la recomendación de Winograd y repensar desde el principio el tema de la programación de ordenadores. Necesitamos un paradigma unificador basado en conceptos de muy alto nivel que nos permita reconocer la raíz de todos los lenguajes y de todos los paradigmas, para así poder definir un lenguaje formal universal, que debería ser el fundamento de la web semántica.
Informática vs. Matemática
La unificación
Hasta ahora informática y matemática han sido disciplinas distintas. Es ya la hora de tratar de unificar ambas disciplinas a través de unos mecanismos conceptuales suficientemente genéricos e intuitivos. La semántica formal debería constituir la fundamentación común de la matemática y la informática.
Una cierta integración ya está teniendo lugar en diferentes frentes:
Muchos conceptos matemáticos se han incluido en diferentes lenguajes de programación. Incluso se han diseñado lenguajes específicos para modelar conceptos matemáticos.
Los conceptos matemáticos se usan a veces para expresar la semántica de los programas (por ejemplo, en la semántica denotacional).
Muchos conceptos matemáticos concebidos de forma limitada, han sido generalizados por la informática.
Conceptos nuevos y mecanismos de expresión muy poderosos, utilizados por los lenguajes de programación, pueden enriquecer la matemática. Por ejemplo:
El concepto de “repetición” (un cierto número de veces).
Los conceptos de bucle y subrutina (ambos inventados por Ada). Un bucle es una estructura operativa: la repetición de la ejecución de una secuencia de instrucciones mientras se cumpla una determinada condición. Una subrutina es una secuencia de instrucciones que puede ser invocada todas las veces que se necesite.
El concepto de “distribución”, también utilizado por algunos lenguajes informáticos. Por ejemplo, en el lenguaje de especificación Z [McMorran, 1993], se utiliza este concepto, aunque restringido a ciertas operaciones: composición, concatenación, intersección, solapamiento y unión.
En matemática no existe un operador específico de distribución, sino que la distribución es una propiedad que cumple o no una operación respecto a otra.
El producto cartesiano de conjuntos se puede considerar una operación de distribución restringida y particular. En efecto, los operandos tienen que ser forzosamente conjuntos y el resultado es un conjunto de secuencias.
Lo que necesitamos es un mecanismo de distribución generalizado que permita diferentes tipos de argumentos, que se aplique a diferentes operaciones.
En definitiva, el objetivo último que se debe perseguir es la unificación de ambas disciplinas, y conseguir que la nueva notación matemática sea “ejecutable”, comprensible por los ordenadores. Un intento en este sentido es el del lenguaje J [Iverson, 1995].
Aportaciones de la informática a la matemática
Desde la aparición de la informática, la matemática ya no la vemos igual porque la informática ha fertilizado a la matemática, proporcionándola una nueva visión, un nuevo paradigma, una nueva forma de contemplarla que ha ayudado a clarificarla, a comprenderla mejor.
La informática es una ciencia relativamente reciente, que nació gracias a la matemática, pero que ha influido, y está influyendo, en la propia matemática, enriqueciéndola. Este proceso de realimentación es una especie de “devolución del favor prestado”, que se está realizando de diversas formas:
Lenguaje.
La aparición de los lenguajes de programación ha abierto la cuestión de la formalización del lenguaje matemático.
El método algorítmico para la formulación y resolución de problemas.
El proceso simbólico, más allá del cálculo numérico.
Fundamentación.
De la misma manera que los ordenadores existe un juego de instrucciones para realizar cualquier cálculo, en matemática debería haber un conjunto de conceptos principales o primarios con los que expresar cualquier concepto matemático derivado.
La matemática experimental, que explicamos a continuación.
La matemática experimental
La matemática experimental es un tipo de investigación matemática que utiliza la computación y la representación gráfica para hacer la matemática más tangible y visible, tanto para el matemático profesional como para el aficionado. Este tipo de hacer matemática siempre ha sido practicada por los matemáticos, aunque ha emergido con fuerza desde la invención del ordenador. El ordenador se ha convertido en una herramienta imprescindible para la investigación científica, como el telescopio es para el astrónomo.
“La matemática no es una ciencia deductiva eso es un cliché. Cuando tratamos de demostrar un teorema, no establecemos las hipótesis y luego comenzamos a razonar. Lo que hacemos es prueba y error, experimentación, conjeturas. Queremos descubrir lo que son los hechos, y lo que hacemos a ese respecto es similar a lo que hace un técnico de laboratorio” [Halmos, 1985].
Entre las actividades y propósitos de la matemática experimental están:
Estudiar estructuras matemáticas para intentar descubrir sus propiedades o patrones.
Probar conjeturas e hipótesis. Por ejemplo, la hipótesis de Riemann sobre la estructura de los números primos.
Realizar cálculos derivados e inferencias automáticas.
Buscar contraejemplos.
Demostrar teoremas.
En este último tema, el ejemplo más paradigmático es el famoso “teorema de los cuatro colores” (4 colores son suficientes para colorear un mapa), demostrado con la ayuda de un ordenador en 1976 por Kenneth Appel y Wolfgang Haken. Este teorema necesita para verificarse un ordenador. Ron Graham (un matemático de los Laboratorios Bell) se preguntaba: “Si ningún humano puede verificar la demostración, ¿se trata verdaderamente de una demostración?”.
No conocemos el código fuente del programa ni el lenguaje con el que fue escrito. Disponer de un lenguaje estandar, canónico y universal común a humanos y ordenadores sería de una gran ayuda, pues todo el mundo podría juzgar y comprobar si se trata de una verdadera demostración.
Algunos ejemplos de logros de la matemática experimental con la ayuda de ordenador son:
La teoría del caos, que debe su existencia a la moderna tecnología informática, pues ha permitido visualizar gráficamente estructuras complejas. Edward Lorenz encontró su famoso “atractor” en un sistema caótico.
El descubrimiento en 1995 de la formula de Bailey-Borwein-Plouffe relativa a la estructura de los dígitos binarios de π. Esta formula fue posteriormente demostrada formalmente.
El experimento numérico llamado FPU (por las iniciales de sus autores: Fermi, Pasta y Ulam), realizado en 1955, consistente en el estudio de una cuerda vibrante (un problema de tipo no lineal), mediante simulación por ordenador del Laboratorio Científico de Los Álamos. Descubrieron que el comportamiento del sistema era muy diferente al esperado por la intuición. Su comportamiento era muy complejo, de tipo cuasiperiódico.
La informática no solo ha fertilizado a la matemática. También lo ha hecho con otras ciencias susceptibles de una cierta formalización. También de ella han derivado nuevas disciplinas, como la inteligencia artificial, la vida artificial y la ciencia de la web (Web Science).
Bibliografía
Ait-Kaci, H.; Podelski, A. Towards a meaning of LIFE (programming language). Third International Symposium PLILP'91 (Programming Language Implementation and Logic Programming, Passan, Germany, 26-28 Aug. 1991), pp. 255-274.
Backus, John. Can Programming be liberated from the Von Neumann stile?. A functional style and its algebra of programs. CACM, vol. 21, Ag. 1978, pp. 613-641.
Bobrow, D.G.; Kahn, K.; Kiczales, G.; Masinter, L.; Stefik, M.; Zdybel, F.. CommonLoops: mergins Lisp and object-oriented programming. OOPSLA'86: Special Issue of SIGPLAN Notices 21: 17-29, 1986.
Dovier, A. ; Omodeo, E.G. ; Pontelli, E. ; Rossi, G. Embedding finite sets in a logic programming language. Proceedings of ELP'92 (Third International Workshop Extensions of Logic Programming, Bologna, Italy, 26-28 Feb. 1992), pp. 150-167.
Glasgow & Jenkins. Array theory, logic and the Nial language. Proceedings 1988 International Conference on Computer Language (IEEE Cat. Nº 88CH2647-6), pp. 296-303.
De Root, D.; G. Lindstrom, G. (Eds). Logic Programming: Functions, Relations and Equations. Prentice-Hall, Englewood Cliffs, N.J., 1986.
Glasgow, J. The logic programming paradigm in Nial. Proc. of the Fourth Annual A.I. and Advanced Computer Technology Conf., pp. 13-22, Conferencia 4-6 Mayo 1988.
Glasgow, Jenkins, Blevis y Feret. Logic Programming with arrays. IEEE Transactions on Knowledge and Data Engineering, 3-3, pp. 307-319, Sep. 1991.
Hailpern, B. Multiparadigm languages and environments. IEEE Software 3:6-9, 1986.
Hailpern, B. Design of a multiparadigm language. Notes from a session by Dr. Hailpern at IBM Thomas J. Watson Research Center, Yorktown Heights, N.Y., 1987.
Halmos, Paul. I want to be a mathematician: An automathography. Springer-Verlag, 1985.
Howe; D.J.; Stoller, S.D. An operational approach to combining classical set theory and functional programming languages. Theoretical Aspects of Computer Software. International Symposium TACS'94 Proccedings, pp. 36-55. Conference: Sendai (Japan), 19-22 April 1994. Springer-Verlag, Berlin, 1994, ISBN 3 540 57887 0.
Hull, Richard; Roger King, Roger. Semantic database modeling: survey, applications, and research issues. ACM Computing Surveys, 19-3 (1987), pp. 201-260.
Jenkins, M.A. Prototyping intelligent database applications in Nial. Proc. of the Forth Annual A.I. and Advanced Computer Technology Conf., pp. 23-34, Conferencia 4-6 Mayo 1988.
Jenkins, M.A.; Glasgow, J.I. A logical base for nested array data structures. Computer Languages, 14-1, pp. 35-1, 1989.
Jenkins, M.A. Q' Nial: a portable interpreter for Nested Interactive Array Language. Software - Practice and Experience, 19-2, pp. 111-126, Feb. 1989.
Koschmann, T.; Evens, M.W. Bridging the gap between object-oriented and logic programming. IEEE Software 5: 36-42, 1988.
Kuhn, Thomas S. La estructura de las revoluciones científicas. Fondo de Cultura Económica, 1977.
Lindstrom, G. Functional programming and the logical variable. Twelfth Annual ACM Symposium on Principles of Programming Languages, pp. 266-279, 1985.
Moon, D. Object-oriented programming with flavors. OOPSLA'86: Special Issue of SIGPLAN Notices 21: 1-8, 1986.
Placer, John. Multiparadigm research: a new direction in language design.
SIGPCAN Notices, vol. 26, nº. 3, pp. 9-17, March 1991.
Placer, John. G: a language based on demand-driven stream evaluations. Ph. D. dissertation at Oregon State University, 1988.
Placer, John. The multiparadigm language G. Computer Languages, vol. 16, nº. 3-4, pp. 235-258, 1991.
Placer, John. Integrating destructive assignment and lazy evaluation in the multiparadigm language G-2. SIGPLAN Notices, 27 (2): 65-74, Feb. 1992.
Rumbaugh, J. Relations as semantic constructs in an object-oriented language. OOPSLA'87: Special Issue of SIGPLAN Notices 22: 466-481, 1987.
Schmidt, David A. On the Need for a Popular Formal Semantics. ACM Sigplan Notices, 32 (1), Enero 1997, pp. 115-116.
Subrahmanyam, P.A.; J. You, J. Pattern driven lazy reduction: a unifying evaluation mechamism for functional and logic programs. Eleventh Anuval ACM Symp. on Principles of Programming Languages, pp. 228-234, 1984.
Winograd, Terry. Beyond Programming Languages. Communications of the ACM, 22: 7, Julio 1979.